package org.convallaria.system.biz.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.convallaria.infrastruct.db.entity.BaseEntity;

import java.io.Serial;

/**
 * 系统菜单实体类
 * 
 * 功能特性：
 * - 支持菜单层级管理（树形结构）
 * - 支持多租户数据隔离
 * - 支持软删除机制
 * - 支持乐观锁并发控制
 * - 支持数据审计追踪
 * - 支持菜单状态管理
 * - 支持菜单类型管理（目录、菜单、按钮）
 * - 支持菜单显示控制
 * - 支持外链和缓存控制
 * - 支持权限标识管理
 * 
 * 业务说明：
 * - 菜单管理是权限系统的核心组件
 * - 支持无限层级的菜单树结构
 * - 通过parent_id字段维护层级关系
 * - 支持目录、菜单、按钮三种类型
 * - 支持菜单的显示和隐藏控制
 * - 支持外链和内链区分
 * - 支持菜单缓存控制
 * - 支持权限标识管理
 * 
 * 菜单类型：
 * - M：目录，用于组织菜单结构
 * - C：菜单，用于页面导航
 * - F：按钮，用于页面操作权限控制
 * 
 * 层级关系：
 * - parent_id：父菜单ID，0表示根菜单
 * - order_num：显示顺序，数值越小越靠前
 * 
 * 关联关系：
 * - 与角色表：多对多关系，通过sys_role_menu关联表
 * - 与租户表：多对一关系，通过tenant_id关联
 * 
 * 数据约束：
 * - menu_name：菜单名称，必填
 * - menu_type：菜单类型，M/C/F
 * - status：菜单状态，0=正常，1=停用
 * - visible：显示状态，0=显示，1=隐藏
 * - is_frame：外链标识，0=外链，1=内链
 * - is_cache：缓存标识，0=缓存，1=不缓存
 * 
 * @author convallaria
 * @since 1.0.0
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sys_menu")
public class SysMenu extends BaseEntity {

    @Serial
    private static final long serialVersionUID = 1L;

    /**
     * 菜单ID
     * 主键，自增长
     */
    @TableId("menu_id")
    private Long menuId;

    /**
     * 菜单名称
     * 菜单显示名称，必填字段
     */
    @TableField("menu_name")
    private String menuName;

    /**
     * 父菜单ID
     * 0表示根菜单，其他值表示父菜单ID
     */
    @TableField("parent_id")
    private Long parentId;

    /**
     * 显示顺序
     * 菜单在树形结构中的显示顺序，数值越小越靠前
     */
    @TableField("order_num")
    private Integer orderNum;

    /**
     * 路由地址
     * 前端路由地址，用于页面导航
     */
    @TableField("path")
    private String path;

    /**
     * 组件路径
     * 前端组件路径，用于页面渲染
     */
    @TableField("component")
    private String component;

    /**
     * 路由参数
     * 路由参数，用于页面传参
     */
    @TableField("query")
    private String query;

    /**
     * 是否为外链
     * 0=是外链，1=不是外链
     */
    @TableField("is_frame")
    private Integer isFrame;

    /**
     * 是否缓存
     * 0=缓存，1=不缓存
     */
    @TableField("is_cache")
    private Integer isCache;

    /**
     * 菜单类型
     * M=目录，C=菜单，F=按钮
     */
    @TableField("menu_type")
    private String menuType;

    /**
     * 菜单状态
     * 0=显示，1=隐藏
     */
    @TableField("visible")
    private String visible;

    /**
     * 菜单状态
     * 0=正常，1=停用
     */
    @TableField("status")
    private String status;

    /**
     * 权限标识
     * 用于权限控制，如system:user:list
     */
    @TableField("perms")
    private String perms;

    /**
     * 菜单图标
     * 菜单图标，用于前端显示
     */
    @TableField("icon")
    private String icon;

    /**
     * 租户ID
     * 多租户数据隔离标识
     */
    @TableField("tenant_id")
    private Long tenantId;
}
